import { ref } from "vue"
import { defineStore } from 'pinia'
import { createCompletionsAPI, saveChatHistoryAPI } from "@/api/index.js"
import { inProgressStore } from "./inProgress"
import { useUserStore } from "./user.js"

// 文生文
export const chatbotMessageStore = defineStore('chatbotMessage', () => {
	const messages = ref([]) //存储聊天记录 {"role": "user", "content": ""}
	const receiveText = ref('') //接受大模型返回的文本数据
	const inProgress = inProgressStore() // 对话是否进行中
	const userStore = useUserStore() // 用户相关的数据

	// 接收服务器端大模型返回的数据
	const handleText = async (objVal) => {
		let aiMessages = messages.value[messages.value.length - 1]
		// 服务器开始响应
		aiMessages.finish_reason = 'respond'
		// 把大模型发返回的文本追加到receiveText
		receiveText.value += objVal.choices[0].delta.content || ''
		// 把文本追加到ai的回复中
		aiMessages.content = receiveText.value
		// 判断是否回复完毕
		if (objVal.choices[0].finish_reason) {
			// 存储状态
			aiMessages.finish_reason = objVal.choices[0].finish_reason
			// 如果有联网查询的数据
			aiMessages.web_search = objVal.web_search ? objVal.web_search : []
			// 如果回复异常
			const condition = [
				{ type: 'length', content: '到达token上限,请重新开启新会话' },
				{ type: 'sensitive', content: '非常抱歉，我目前无法提供你需要的具体信息' },
				{ type: 'network_error', content: '推理异常，我或许出现了一些问题，你可以重新尝试' },
			]
			condition.forEach(item => {
				if (objVal.choices[0].finish_reason === item.type) {
					aiMessages.content = item.content
				}
			})
			// 对话已完毕
			inProgress.setStatus(false)
			// 存储对话记录到服务器
			const uploadChat = messages.value.slice(-2)
			const { data } = await saveChatHistoryAPI({
				messages: uploadChat,
				sessionId: userStore.sessionId
			})
			// 新对话存储到聊天记录
			if (!userStore.sessionId) {
				userStore.setChatList(data)
				userStore.setSessionId(data.session_id)
			}
		}
	}

	// 发送数据到服务器端
	const startSending = async (content) => { //content:发送的值
		receiveText.value = '' //清空上一次的结果
		messages.value.push({ "role": "user", content })
		messages.value.push({
			"role": "assistant",
			"content": "",
			"finish_reason": "start",
			"web_search": [], //搜索网页返回的结果
		})
		// 对话正在进行中
		inProgress.setStatus(true)
		/* 
		 finish_reason：
			start：开始中，
			respond:ai响应中
			stop代表推理自然结束或触发停止词。
			tool_calls 代表模型命中函数。
			length代表到达 tokens 长度上限。
			sensitive 代表模型推理内容被安全审核接口拦截。请注意，针对此类内容，请用户自行判断并决定是否撤回已公开的内容。
			network_error 代表模型推理异常。
		 */
		// 请求服务器端进行发送
		try {
			await createCompletionsAPI({ messages: messages.value })
		} catch (err) {
			messages.value[messages.value.length - 1].finish_reason = 'stop'
			messages.value[messages.value.length - 1].content = 'AI回复异常,你可重试'
			// 对话结束
			inProgress.setStatus(false)
		}
	}

	// 清空聊天记录
	const removeMessage = () => {
		messages.value = []
	}
	// 设置聊天记录
	const setMessage = (list) => {
		messages.value = list
	}

	return { messages, removeMessage, setMessage, receiveText, handleText, startSending }
})